using System;
using System.Collections.Generic;
using Me.Prettyprint.Cassandra.Model;
using Me.Prettyprint.Cassandra.Model.Thrift;
using Me.Prettyprint.Cassandra.Service;
using Me.Prettyprint.Cassandra.Utils;
using Me.Prettyprint.Hector.Api;
using Me.Prettyprint.Hector.Api.Beans;
using Me.Prettyprint.Hector.Api.Factory;
using Me.Prettyprint.Hector.Api.Mutation;
using Thrift;

namespace Me.Prettyprint.Cassandra.Service.Template
{
    /// <summary>
    /// A common interface for access to the resuls of a query of either a standard or super column family.
    /// There are different implementations of this which hide the differences requires of standar/super 
    /// column families. As this interface inherits from {@link ResultStatus}, results will also provide
    /// execution details.
    /// </summary>
    /// <typeparam name="K"></typeparam>
    /// <typeparam name="N"></typeparam>
    public interface ColumnFamilyResult<K, N> : ResultStatus
    {
        K Key
        {
            get;
        }
        Guid GetUUID(N columnName);
        string GetString(N columnName);
        long GetLong(N columnName);
        int GetInteger(N columnName);
        float GetFloat(N columnName);
        double GetDouble(N columnName);
        bool GetBoolean(N columnName);
        byte[] GetByteArray(N columnName);
        DateTime GetDate(N columnName);
        List<N> GetColumnNames();
        HColumn<N, byte[]> GetColumn(N columnName);
        bool HasResults
        {
            get;
        }
        bool HasNext();
        ColumnFamilyResult<K, N> Next();
    }
}